package com.phiture.erp.produce.core.service;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.phiture.erp.produce.core.pojo.dto.ErpProductionTaskPageReqDTO;
import com.phiture.erp.produce.core.pojo.dto.ErpProductionTaskReportDTO;
import com.phiture.erp.produce.core.pojo.dto.ErpProductionTaskSaveReqDTO;
import com.phiture.erp.produce.core.pojo.vo.ErpProductionTaskMaterialVO;
import com.phiture.erp.produce.core.pojo.vo.ErpProductionTaskProcessesVO;
import com.phiture.erp.produce.dal.entity.ErpProductionTaskDO;
import com.phiture.erp.produce.dal.entity.ErpProductionTaskMaterialDO;
import com.phiture.erp.produce.dal.entity.ErpProductionTaskProcessesDO;
import com.phiture.erp.produce.dal.pojo.vo.ErpProductionTaskRespVO;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 生产任务 Service 接口
 *
 * @author YH
 */
public interface ErpProductionTaskService {

    /**
     * 创建生产任务
     *
     * @param createReqDTO 创建信息
     * @return 编号
     */
    Long createProductionTask(ErpProductionTaskSaveReqDTO createReqDTO);

    /**
     * 更新生产任务
     *
     * @param updateReqDOT 更新信息
     */
    void updateProductionTask(ErpProductionTaskSaveReqDTO updateReqDOT);

    /**
     * 更新生产任务单的入库数量
     *
     * @param id 编号
     * @param inCountMap 入库数量 Map：key 生产任务单ID；value 入库数量
     */
    ErpProductionTaskDO updateProductionTaskInCount(Long id, Map<Long, BigDecimal> inCountMap);

    /**
     * 删除生产任务
     *
     * @param id 编号
     */
    void deleteProductionTask(Long id);

    /**
     * 获得生产任务
     *
     * @param id 编号
     * @return 生产任务
     */
    ErpProductionTaskDO getProductionTask(Long id);

    PageResult<ErpProductionTaskRespVO> getProductionTaskPageForMobile(ErpProductionTaskPageReqDTO pageReqDTO);

    /**
     * 获得生产任务分页
     *
     * @param pageReqDTO 分页查询
     * @return 生产任务分页
     */
    PageResult<ErpProductionTaskRespVO> getProductionTaskPage(ErpProductionTaskPageReqDTO pageReqDTO);

    // ==================== 子表（生产任务单物料清单） ====================

    /**
     * 获得生产任务单物料清单列表
     *
     * @param productionTaskId 任务单ID
     * @return 生产任务单物料清单列表
     */
    List<ErpProductionTaskMaterialVO> getProductionTaskMaterialListByProductionTaskId(Long productionTaskId, Long processId);

    // ==================== 子表（生产任务单工序） ====================

    /**
     * 获得生产任务单工序列表
     *
     * @param productionTaskId 任务单ID
     * @return 生产任务单工序列表
     */
    List<ErpProductionTaskProcessesVO> getProductionTaskProcessesListByProductionTaskId(Long productionTaskId);

    void createErpProductionTaskFromMrp(ErpProductionTaskDO erpProductionTaskDO);
    void createErpProductionTaskMaterialFromMrp(List<ErpProductionTaskMaterialDO> taskMaterialList);
    void createErpProductionTaskProcessesFromMrp(List<ErpProductionTaskProcessesDO> taskProcessesList);

    /**
     * 报工
     *
     * @param reportDTO 报工信息
     * @return 是否成功
     */
    Boolean reportWork(ErpProductionTaskReportDTO reportDTO);
}